module PrintError where

import AbsC
import PrintC

pDeclSErr = foldr ((++) . pDeclErr) []

pDeclErr (DFun t _ _ s _ _) = pTypeErr t ++ pStmtErr s
pDeclErr (DVar t _ m _) = pTypeErr t ++ ds
   where
      ds = f m
      f Nothing = []
      f (Just a) = pInitVar a

pInitVar (EVar t) = pTypeErr t
pInitVar (SIVar (r,t)) = pTypeErr t ++ pRExprErr r
pInitVar (CIVar is t) = pTypeErr t ++ pIVSErr is

pIVSErr = foldr ((++) . pInitVar) []

pRExprErr (InfixOp _ (r,t) (r',t')) =  pTypeErr t ++ pRExprErr r ++ pTypeErr t'++ pRExprErr r
pRExprErr (UnaryOp _ (r,t)) = pTypeErr t ++ pRExprErr r
pRExprErr (FCall _ rs) = pRExprSErr rs
pRExprErr (Const _) = []
pRExprErr (LExpr (l,t)) = pTypeErr t ++ pLExprErr l
pRExprErr (Ref (l,t)) = pTypeErr t ++ pLExprErr l
pRExprErr (Coertion _ _ r) = pRExprErr r

pRExprSErr = foldr ((++) . f) []
   where
      f (r,t) = pTypeErr t ++ pRExprErr r
      
pLExprErr (Deref (r,t)) = pTypeErr t ++ pRExprErr r
pLExprErr (ArrayEl (l,t) (r,t')) = pTypeErr t ++ pLExprErr l ++ pTypeErr t'++ pRExprErr r
pLExprErr (SId _ s) = s
pLExprErr (PrePostIncDecr _ (l,t)) = pTypeErr t ++ pLExprErr l 

pStmtErr (Block ds ss) = pDeclSErr ds ++ pStmtSErr ss
pStmtErr (Jmp j) = pJmpErr j
pStmtErr (Iter i) = pIterErr i
pStmtErr (Sel s) = pSelErr s
pStmtErr (RExprStmt (r,t)) = pTypeErr t ++ pRExprErr r
pStmtErr (Assgn _ (l,t) (r,t')) =  pTypeErr t ++ pLExprErr l ++ pTypeErr t'++ pRExprErr r

pStmtSErr = foldr ((++) . pStmtErr) []

pJmpErr (Break s) = s
pJmpErr (Continue s) = s
pJmpErr (RetExpVoid t) = pTypeErr t
pJmpErr (RetExp (r,t)) = pTypeErr t ++ pRExprErr r

pSelErr (IfNoElse (r,t) s) = pTypeErr t ++ pRExprErr r ++ pStmtErr s
pSelErr (IfElse (r,t) s s') = pTypeErr t ++ pRExprErr r ++ pStmtErr s ++ pStmtErr s'

pIterErr (While (r,t) s) = pTypeErr t ++ pRExprErr r ++ pStmtErr s
pIterErr (DoWhile s (r,t)) = pTypeErr t ++ pRExprErr r ++ pStmtErr s

pTypeErr (TErr s) = s
pTypeErr (PType t) = pTypeErr t
pTypeErr (Array _ t) = pTypeErr t
pTypeErr _ = []